import FlyIo from 'flyio/dist/npm/wx'
import { devApi } from './api/dev-api'
import { proApi } from './api/prod-api'
import { testApi } from './api/test-api'

const debugMode = 1 // 1 开发环境 2 线上环境 3 测试环境
const http = new FlyIo()

const api = [devApi, proApi, testApi][debugMode - 1]
http.config.baseURL = api.apiBase

/**
 * config 请求时的配置
 * @param errorTip 失败的时候 是否提示吐司
 * @param errorText 吐司文本-提示内容
 */

// 请求拦截
http.interceptors.request.use(config => {
    if (!config.hideTip) {
        wx.showLoading({
            title: config.tipText || '请求中...',
            mask: true
        })
    }
    let tenantId = wx.getStorageSync('tenantId')
    let token = wx.getStorageSync('access_token')
    // 添加token
    if (token && !config.headers.isToken) {
        config.headers['Authorization'] = 'Bearer ' + token // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改
    }
    // 添加 租户ID
    tenantId && (config.headers['Tenant'] = tenantId)
    return Promise.resolve(config)
}, error => {
    return Promise.reject(error)
})

// 响应拦截
http.interceptors.response.use(
    response => {
        console.groupCollapsed(`发送请求：`, response.request.url)
        console.log('请求头配置>>>：', response.request)
        if (response.request.autoHideLoading === undefined || response.request.autoHideLoading) {
            setTimeout(() => { wx.hideLoading() }, 800)
        }
        if (response.status) {
            wx.reportMonitor('0', +(response.status))
        }
        if (response.headers.date) {
            let time = new Date().getTime() - new Date(response.headers.date).getTime()
            wx.reportMonitor('1', +(time))
        }
        if (response.request.returnResult) {
            // 根据后台返回的判断标识来抛出promise的处理方式
            if (response.data.success) {
                console.log('返回成功>>>：', response)
                console.log('then的数据>>>：', response.data.result)
                console.groupEnd()
                wx.stopPullDownRefresh({})
                return Promise.resolve(response.data.result)
            } else {
                wx.showToast({
                    title: response.data.message || '请求出错！', // 提示的内容
                    icon: 'none',
                    mask: true,
                    duration: 2500
                })
                console.log('返回失败>>>： ', response)
                console.log('catch的数据>>>：', response.data)
                console.groupEnd()
                wx.stopPullDownRefresh({})
                return Promise.reject(response.data)
            }
        } else {
            console.log('返回成功>>>：', response)
            console.log('then的数据>>>：', response.data)
            console.groupEnd()
            wx.stopPullDownRefresh({})
            return Promise.resolve(response.data)
        }
    },
    error => {
        console.groupCollapsed(`发送请求：`, error.request.url)
        console.log('请求头配置>>>：', error.request)
        if (error.request.autoHideLoading === undefined || error.request.autoHideLoading) {
            setTimeout(() => { wx.hideLoading() }, 800)
        }
        /**
         * 用户自定义错误提示
         */
        if (error.request.errorTip) {
            let toastMsg = error.response.data.message || ''
            if (error.response.status === 503) { toastMsg = '503: 数据加载异常，请重试' }
            if (error.response.status === 401) { toastMsg = toastMsg || '登录已过期' }
            if (error.response.status === 404) { toastMsg = toastMsg || '404: 访问链接不存在' }
            wx.showToast({
                title: error.request.errorText || toastMsg, // 提示的内容
                icon: 'none',
                mask: true,
                duration: 2500
            })
        }

        /**
         * 登录失败，重新登录
         */
        // if ((error.response.status === 401) && (error.request.url !== api.postGetUserToken)) {
        //     console.error('非登录页，登录过期')
        //     wx.clearStorage()
        //     wx.reLaunch({
        //         url: '/pages/loginPages/fastLogin'
        //     })
        // }
        console.log('返回失败>>>： ', error)
        console.log('catch的数据>>>：', error.response.data)
        console.groupEnd()
        wx.stopPullDownRefresh({})
        return Promise.reject(error.response.data)
    }
)
// 接口差异对比
let maxApi = Object.keys(devApi).length > Object.keys(proApi).length ? Object.keys(devApi) : Object.keys(proApi)
let minApi = Object.keys(devApi).length > Object.keys(proApi).length ? Object.keys(proApi) : Object.keys(devApi)

let diffApi = maxApi.filter(apiName => {
    return minApi.indexOf(apiName) === -1
})
console.groupCollapsed(`debug模式：`, ['1 开发环境', '2 线上环境', '3 测试环境'][debugMode - 1])
console.info(`缺少的接口:${diffApi.length}个`)
console.info('当前API环境:', api)
if (diffApi.length > 0) {
    console.error(`${Object.keys(devApi).length >= Object.keys(proApi).length ? 'api.js' : 'dev-api.js'}缺少${diffApi.length}个接口`, diffApi)
}
console.groupEnd()
// 接口差异对比 End

export {
    api,
    http
}
